package com.hmdp.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.dto.Result;
import com.hmdp.dto.UserDTO;
import com.hmdp.entity.Follow;
import com.hmdp.mapper.FollowMapper;
import com.hmdp.service.IFollowService;
import com.hmdp.service.IUserService;
import com.hmdp.utils.UserHolder;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Service
public class FollowServiceImpl extends ServiceImpl<FollowMapper, Follow> implements IFollowService {

	@Resource
	private StringRedisTemplate stringRedisTemplate;

	@Resource
	private IUserService userService;

	@Override
	public Result follow(Long followUserId, Boolean isFollow) {
		// 1.获取登录用户
		Long userId = UserHolder.getUser().getId();
		String key = "follows:" + userId;
		// 1.判断到底是关注还是取关
		if (isFollow) {
			// 2.关注，新增数据
			Follow follow = new Follow();
			follow.setUserId(userId);
			follow.setFollowUserId(followUserId);
			boolean isSuccess = save(follow);
			if (isSuccess) {
				//把关注用户的Id，放入Redis的set集合 sadd userId followUserId
				//这是为了后续实现求通过好友列表
				stringRedisTemplate.opsForSet().add(key, followUserId.toString());
			}
		} else {
			// 3.取关，删除 delete from tb_follow where user_id = ? and follow_user_id = ?
			boolean isSucess = remove(new QueryWrapper<Follow>()
					.eq("user_id", userId).eq("follow_user_id", followUserId));
			if (isSucess){
			//把关注用户的Id从Redis的set集合移除 srem userId followUserId
			stringRedisTemplate.opsForSet().remove(key, followUserId.toString());
			}
		}
		return Result.ok();
	}

	@Override
	public Result isFollow(Long followUserId) {
		// 1.获取登录用户
		Long userId = UserHolder.getUser().getId();
		// 2.查询是否关注 select count(*) from tb_follow where user_id = ? and follow_user_id = ?
		Integer count = query().eq("user_id", userId).eq("follow_user_id", followUserId).count();
		// 3.判断
		return Result.ok(count > 0);
	}

	//求目标用户和当前用户的交集，共同关注人
	@Override
	public Result followCommons(Long id) {
		// 1.获取当前用户
		Long userId = UserHolder.getUser().getId();
		String key = "follows:" + userId;
		// 2.求交集
		String key2 = "follows:" + id;
		Set<String> intersect = stringRedisTemplate.opsForSet().intersect(key, key2);
		if (intersect == null || intersect.isEmpty()) {
			// 无交集
			return Result.ok(Collections.emptyList());
		}
		// 3.解析id集合
		List<Long> ids = intersect.stream().map(Long::valueOf).collect(Collectors.toList());
		// 4.查询用户
		List<UserDTO> users = userService.listByIds(ids)
				.stream()
				.map(user -> BeanUtil.copyProperties(user, UserDTO.class))
				.collect(Collectors.toList());
		return Result.ok(users);
	}
}
